package reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;

public class ConstructorDemo {


    @Test
    public void test2() throws Exception {
        // getDeclaredConstructors: 获取所有的构造方法(不区分修饰符)
        // getDeclaredConstructor:在getDeclaredConstructors范围内, 获取其中的一个构造方法
        Class c = Class.forName("reflect.Person");
        Constructor[] cons = c.getDeclaredConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }
        System.out.println("---------------");

        Constructor con = c.getDeclaredConstructor(String.class, int.class, int.class);
        System.out.println(con);

        // 创建对象
        // 暴力访问
        con.setAccessible(true);
        Person person = (Person) con.newInstance("李四", 25, 178);
        System.out.println(person);

    }

    @Test
    public void test1() throws Exception {
        Class c = Class.forName("reflect.Person");
//        getConstructors: 获取所有的public修饰的构造方法
        Constructor[] cons = c.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }

        System.out.println("---------------");

        // getConstructor: 在getConstructors范围内, 获取其中的一个构造方法
        Constructor con1 = c.getConstructor();
        Constructor con2 = c.getConstructor(String.class);
        System.out.println(con1);
        System.out.println(con2);

        System.out.println("---------------");

        // 使用 Constructor 对象
        // 构造方法的用处就是创建对象
        // 确定要使用的构造方法
        // newInstance(); 参数就是调用构造方法传递的参数
        // new Person();
        // new Person("zs");
        Person person = (Person) con1.newInstance();

        Person person1 = (Person) con2.newInstance("张三");

        System.out.println(person);
        System.out.println(person1);


    }
}
